package com.ykht.proj.comsrv.controller;

import com.ykht.proj.admin.api.feign.RemoteFileService;
import com.ykht.proj.common.core.util.R;
import com.ykht.proj.comsrv.utils.msgutil.QrCodeUtil.QRcodeUtil;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.ByteArrayInputStream;
import java.io.InputStream;


@RestController
@Slf4j
public class QRCodeController {

	@Resource
	private RemoteFileService remoteFileService;
	@Resource
	private QRcodeUtil qRcodeUtil;


	String sceneStr = "最大32个可见字符，只支持数字，大小写英文以及部分特殊字符：!#$&'()*+,/:;=?@-._~，其它字符请自行编码为合法字符（因不支持%，中文无法使用 urlencode 处理，请使用其他编码方式）";

	@ApiOperation(value = "生成小程序二维码")
	@GetMapping("/QRcode")
	public R QRcode(String scene,String page,String bcType) {
		try {
			log.info("QRcode->scene:{},page:{},bcType:{}",scene,page,bcType);
			if(StringUtils.isEmpty(bcType)) bcType = "b";
			if (scene!=null) if (scene.length()>32) return R.failed(sceneStr);
			return R.ok(qRcodeUtil.QRcode(scene,page,bcType));
		} catch (Exception e) {
			e.printStackTrace();
			return R.failed();
		}
	}

	/**
	 * sence最长32，这个接口初衷是  b端分享调c端在sence中穿参数用的，32太短。
	 * 有更好的替代方案
	 * --->>>>前端提前将所传的参数传入后台，后台缓存起来并生成token返给前端(缓存设置失效时间)，只需要将token传入sence中,c端直接从缓存中获取数据即可，
	 * @param scene
	 * @param page
	 * @param bcType
	 * @return
	 */
	@ApiOperation(value = "生成小程序二维码，并上传返回连接")
	@GetMapping("/QRcode4url")
	public R QRcode4url(String scene,String page,String bcType) {
		try {
			log.info("QRcode4url->scene:{},page:{},bcType:{}",scene,page,bcType);
			if(StringUtils.isEmpty(bcType)) bcType = "b";
			if (scene!=null) if (scene.length()>32) return R.failed(sceneStr);

			byte[] result = qRcodeUtil.QRcode4Byte(scene,page,bcType);

			InputStream inputStream = new ByteArrayInputStream(result);
			MultipartFile file = new MockMultipartFile("qr.jpg","qr.jpg","application/octet-stream", inputStream);

			return remoteFileService.upload4url(file);
		} catch (Exception e) {
			e.printStackTrace();
			return R.failed();
		}
	}
}
